﻿using CLM.Gestao.Administrador.DAL;
using CLM.Gestao.Importacao;
using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;

namespace CLM.Gestao.Administrador.BLL
{
    public class CentroCustoAtivo : CentroCustoAtivoBLO<TB_CENTRO_CUSTO_ATIVO>
    {
        #region Conversões

        /// <summary>
        /// Converte uma lista de objetos do tipo Lista para uma lista de objetos do tipo correspondente no EDM
        /// </summary>
        /// <param name="pLista"></Lista></param>
        /// <returns></returns>
        private List<TB_CENTRO_CUSTO_ATIVO> ConvertToEDM(List<Lista> pLista)
        {
            List<TB_CENTRO_CUSTO_ATIVO> List = (from l in pLista
                                                select new TB_CENTRO_CUSTO_ATIVO
                                                {
                                                    ID_CENTRO_CUSTO_ATIVO = l.IdCentroCustoAtivo,
                                                    ID_CENTRO_CUSTO = l.IdCentroCusto,
                                                    TB_CENTRO_CUSTO = //l.IndicaCentroCustoProjeto == false ? null : new TB_CENTRO_CUSTO
                                                    {
                                                        //ID_CENTRO_CUSTO = l.IdCentroCusto,
                                                        CODIGO_CENTRO_CUSTO = l.CodigoCentroCusto.ToString(),
                                                        SIGLA_CENTRO_CUSTO = l.SiglaCentroCusto.ToString(),
                                                        NOME_CENTRO_CUSTO = l.NomeCentroCusto.ToString(),
                                                        INDICA_DESPESAS_CORPORATIVAS = l.IndicaDespesaCorporativa,
                                                        INDICA_CENTRO_CUSTO_PROJETO = l.IndicaCentroCustoProjeto,
                                                        ID_CATEGORIA_CENTRO_CUSTO = l.IdCategoriaCentroCusto,
                                                        INDICA_TRADE_ALLOWANCE = l.IndicaTradeAllowance,
                                                        INDICA_GERENCIAL = l.IndicaGerencial,
                                                        INDICA_ALOCACAO = l.IndicaAlocacao
                                                    },
                                                    ID_PERIODO = l.IdPeriodo,
                                                    INDICA_ATIVO = l.IndicaAtivo,
                                                    ID_NIVEL_ESTRUTURA = l.IdNivelEstrutura,
                                                    ID_CENTRO_CUSTO_PAI = l.IdCentroCustoPai,
                                                    INDICA_CONCILIACAO = l.IndicaConciliacao
                                                }).ToList();
            return List;
        }

        private List<Lista> ConvertToContext(List<TB_CENTRO_CUSTO_ATIVO> pContext)
        {
            List<Lista> List = (from l in pContext
                                select new Lista
                                {
                                    IdCentroCustoAtivo = l.ID_CENTRO_CUSTO_ATIVO,
                                    IdCentroCusto = l.ID_CENTRO_CUSTO,
                                    CodigoCentroCusto = l.TB_CENTRO_CUSTO.CODIGO_CENTRO_CUSTO,
                                    SiglaCentroCusto = l.TB_CENTRO_CUSTO.SIGLA_CENTRO_CUSTO,
                                    NomeCentroCusto = l.TB_CENTRO_CUSTO.NOME_CENTRO_CUSTO,
                                    IndicaDespesaCorporativa = l.TB_CENTRO_CUSTO.INDICA_DESPESAS_CORPORATIVAS,
                                    IndicaCentroCustoProjeto = l.TB_CENTRO_CUSTO.INDICA_CENTRO_CUSTO_PROJETO,
                                    IdCategoriaCentroCusto = l.TB_CENTRO_CUSTO.ID_CATEGORIA_CENTRO_CUSTO,
                                    IndicaTradeAllowance = l.TB_CENTRO_CUSTO.INDICA_TRADE_ALLOWANCE,
                                    IndicaGerencial = l.TB_CENTRO_CUSTO.INDICA_GERENCIAL,
                                    IndicaAlocacao = l.TB_CENTRO_CUSTO.INDICA_ALOCACAO,
                                    IdPeriodo = l.ID_PERIODO,
                                    DescricaoPeriodo = l.TB_PERIODO.DESCRICAO_PERIODO,
                                    IdNivelEstrutura = l.ID_NIVEL_ESTRUTURA,
                                    NomeNivelEstrutura = l.TB_NIVEL_ESTRUTURA.NOME_NIVEL_ESTRUTURA,
                                    OrdemNivelEstrutura = l.TB_NIVEL_ESTRUTURA.ORDEM_NIVEL,
                                    IdCentroCustoPai = l.ID_CENTRO_CUSTO_PAI,
                                    NomeCentroCustoPai = l.TB_CENTRO_CUSTO1.NOME_CENTRO_CUSTO,
                                    IndicaAtivo = l.INDICA_ATIVO,
                                    IndicaConciliacao = l.INDICA_CONCILIACAO
                                }).ToList();
            return List;
        }

        #endregion Conversões

        #region CRUD

        public void Add(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Add(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Delete(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Delete(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Update(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Update(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Efetua a pesquisa na tabela, filtrando as solicitações do usuário
        /// </summary>
        /// <param name="pPesquisa">pPesquisa</param>
        /// <returns>Lista</returns>
        private IQueryable<TB_CENTRO_CUSTO_ATIVO> Get(Lista pPesquisa)
        {
            IQueryable<TB_CENTRO_CUSTO_ATIVO> Consulta;

            Consulta = from p in GetAll()
                       select p;
            if (pPesquisa != null)
            {
                if (!string.IsNullOrWhiteSpace(pPesquisa.NomeNivelEstrutura))
                    Consulta = from p in Consulta where p.TB_CENTRO_CUSTO.NOME_CENTRO_CUSTO.Contains(pPesquisa.NomeNivelEstrutura) select p;
            }
            return Consulta;
        }

        #endregion CRUD

        #region Retorna Listas e Itens

        public List<Lista> GetLista()
        {
            return GetLista(new Lista());
        }

        public List<Lista> GetLista(Lista pPesquisa)
        {
            var ListaUsuario = (from p in Get(pPesquisa)
                                select new Lista()
                                {
                                    IdCentroCustoAtivo = p.ID_CENTRO_CUSTO_ATIVO,
                                    IdCentroCusto = p.ID_CENTRO_CUSTO,
                                    CodigoCentroCusto = p.TB_CENTRO_CUSTO.CODIGO_CENTRO_CUSTO,
                                    SiglaCentroCusto = p.TB_CENTRO_CUSTO.SIGLA_CENTRO_CUSTO,
                                    NomeCentroCusto = p.TB_CENTRO_CUSTO.NOME_CENTRO_CUSTO,
                                    IndicaDespesaCorporativa = p.TB_CENTRO_CUSTO.INDICA_DESPESAS_CORPORATIVAS,
                                    IndicaCentroCustoProjeto = p.TB_CENTRO_CUSTO.INDICA_CENTRO_CUSTO_PROJETO,
                                    IdCategoriaCentroCusto = p.TB_CENTRO_CUSTO.ID_CATEGORIA_CENTRO_CUSTO,
                                    IndicaTradeAllowance = p.TB_CENTRO_CUSTO.INDICA_TRADE_ALLOWANCE,
                                    IndicaGerencial = p.TB_CENTRO_CUSTO.INDICA_GERENCIAL,
                                    IndicaAlocacao = p.TB_CENTRO_CUSTO.INDICA_ALOCACAO,
                                    IdPeriodo = p.ID_PERIODO,
                                    DescricaoPeriodo = p.TB_PERIODO.DESCRICAO_PERIODO,
                                    IdNivelEstrutura = p.ID_NIVEL_ESTRUTURA,
                                    NomeNivelEstrutura = p.TB_NIVEL_ESTRUTURA.NOME_NIVEL_ESTRUTURA,
                                    OrdemNivelEstrutura = p.TB_NIVEL_ESTRUTURA.ORDEM_NIVEL,
                                    IdCentroCustoPai = p.ID_CENTRO_CUSTO_PAI,
                                    NomeCentroCustoPai = p.TB_CENTRO_CUSTO1.NOME_CENTRO_CUSTO,
                                    IndicaAtivo = p.INDICA_ATIVO,
                                    IndicaConciliacao = p.INDICA_CONCILIACAO
                                }).ToList();
            return ListaUsuario;
        }

        public List<Itens> GetItens()
        {
            return GetItens(new Lista());
        }

        public List<Itens> GetItens(Lista pPesquisa)
        {
            List<Itens> ListaUsuario = (from p in Get(pPesquisa)
                                        select new Itens()
                                        {
                                            //IdCentroCusto = p.ID_CENTRO_CUSTO,
                                            //CodigoCentroCusto = p.cod
                                        }).ToList();
            return ListaUsuario;
        }

        #endregion Retorna Listas e Itens

        #region Consultas

        #endregion Consultas

        #region Processos

        #region Sincroniza Centros de Custo

        public void SincronizaCentrosCusto()
        {
            Protheus.BLL.SpCentroCustoGaldermaNacional ProcedureCentrosCusto = new Protheus.BLL.SpCentroCustoGaldermaNacional();
            List<Protheus.BLL.SpCentroCustoGaldermaNacional> ListaProdutosGalderma = ProcedureCentrosCusto.ExecutaProcedure();

            List<Itens> ProdutosSQL = (from p in Get(new Lista())
                                       select new Itens
                                       {
                                           //CodigoCentroCusto = p.CODIGO_PRODUTO,
                                           //NomeProduto = p.NOME_PRODUTO
                                       }).ToList();

            OnImportData(this, new ImportDataEventArgs("Centros de Custo", 1, 100));
        }

        #endregion Sincroniza Produtos Nacionais

        #endregion

        #region Classes

        /// <summary>
        /// Classe utilizada para preenchimento de Combos
        /// </summary>
        public class Itens
        {
            public int IdCentroCusto { get; set; }
            public string CodigoCentroCusto { get; set; }
            public string NomeCentroCusto { get; set; }
        }

        /// <summary>
        /// Classe utilizada para preenchimento de Grids
        /// </summary>
        public class Lista
        {
            public int IdCentroCustoAtivo { get; set; }
            public int? IdCentroCusto { get; set; }
            public string CodigoCentroCusto { get; set; }
            public string SiglaCentroCusto { get; set; }
            public string NomeCentroCusto { get; set; }
            public bool? IndicaDespesaCorporativa { get; set; }
            public bool? IndicaCentroCustoProjeto { get; set; }
            public int? IdCategoriaCentroCusto { get; set; }
            public bool? IndicaTradeAllowance { get; set; }
            public bool? IndicaGerencial { get; set; }
            public bool? IndicaAlocacao { get; set; }

            public int? IdPeriodo { get; set; }
            public string DescricaoPeriodo { get; set; }

            public int? IdNivelEstrutura { get; set; }
            public string NomeNivelEstrutura { get; set; }
            public int? OrdemNivelEstrutura { get; set; }

            public int? IdCentroCustoPai { get; set; }
            public string NomeCentroCustoPai { get; set; }

            public bool? IndicaAtivo { get; set; }
            public bool? IndicaConciliacao { get; set; }

        }

        #endregion Classes

        public event ImportDataEventHandler OnImportData;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class CentroCustoAtivoBLO<T> : IBLO<T> where T : TB_CENTRO_CUSTO_ATIVO
    {
        /// <summary>
        /// 
        /// </summary>
        private CentroCustoAtivoDAO<T> _base = new CentroCustoAtivoDAO<T>();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Add(T pEntity)
        {
            Validate(pEntity);
            _base.Add(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Save(T pEntity)
        {
            Validate(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void Delete(T pEntity)
        {
            _base.Delete(pEntity);
            _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Update(T pEntity)
        {
            Validate(pEntity);
            _base.Update(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> GetAll()
        {
            return _base.GetAll();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void Validate(T pEntity)
        {

        }
    }
}